import {decode} from 'js-base64';
import {Message,Alert} from 'element-ui';

// 距离token过期时间提前2分钟刷新token，防止客户端与服务端时间差
const DISTANCE_EXP_TIME = 5 * 60;
const LIVE_EXP_TIME = 2 * 60 * 59;

//中间件页面刷新时在服务端会执行一次，路由跳转时在浏览器端执行一次。
export default  ({app, store, route, redirect, params, query, req, res}) => {

//   //全局守卫业务  检查token是否将要过期
//   console.log('中间件1运行了')
//
//   //1、获取cookie或vuex中的accessToken
//   let accessToken = store.state.user.token;
//   //判断登录和无操作时间大于20分钟
//   if (accessToken && isExp(accessToken)) {
//     console.log('认证过期，请重新登录')
//     Message({showClose: true,type: 'error',duration:0,message:'认证过期，请重新登录'});
//     //Alert("认证过期，请重新登录","提示",{confirmButtonText:"确定"})
//     accessToken = null;
//     app.$cookies.removeAll();
//     store.commit('user/M_UPDATE_USER', {err: 1, msg: '退出登录', token: null, data: null})
//   }
//
//   if (accessToken && needRefreshToken(accessToken)) {
//     // let bundle = await app.$userSecurity.refreshToken()
//     console.log("请求更新jwt")
//     const res = await app.$axios.post('/api/refreshToken')
//     if (res.status == 200 && res.data.result.token) {
//       app.$cookies.set('user', {err: 0, msg: '登录成功', token: res.data.result.token, data: res.data})//写入cookie
//       store.commit('user/M_UPDATE_USER', {err: 0, msg: '登录成功', token: res.data.token, data: res.data})//写入vuex
//     }
//   }
//
//

}

function needRefreshToken(jwt) {
  if (jwt) {
    let payload = jwt.split('.')[1]
    payload = decode(payload)
    payload = JSON.parse(payload)
    let exp = payload.exp
    let time = Math.round(new Date().getTime() / 1000)
    if ((exp - time) <= DISTANCE_EXP_TIME) {
      return true
    }
    //还没有到20分钟过期时间的前2分钟内，触发刷新
    if ((exp - time) <= (DISTANCE_EXP_TIME + LIVE_EXP_TIME)) {
      return true
    }
  }
  return false
}

function isExp(jwt) {
  if (jwt) {
    let payload = jwt.split('.')[1]
    payload = decode(payload)
    payload = JSON.parse(payload)
    let exp = payload.exp
    let time = Math.round(new Date().getTime() / 1000)

    if ((exp - time) <= LIVE_EXP_TIME) {

      return true
    }
  }
  return false
}
